package se.stabby.undersok.model;

import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * User: per.segersten
 * Date: 2014-05-12
 */
public class PågåendeUndersökning {
    public final PågåendeUndersökningId id;
    public final ImmutableList<Svar> svaren;
    public final ImmutableList<Fråga> frågorKvar;
    public final UndersökningsId undersökningId;
    public final Metadata metaData;

    public PågåendeUndersökning(PågåendeUndersökningId id,
                                Undersökning undersökning) {
        this(id, Collections.emptyList(), undersökning.frågor, undersökning.id,
                new Metadata(LocalDateTime.now(), LocalDateTime.now()));
    }

    public PågåendeUndersökning(PågåendeUndersökningId id,
                                Collection<Svar> svaren,
                                Collection<Fråga> frågorKvar,
                                UndersökningsId undersökningId,
                                Metadata metaData) {
        Preconditions.checkNotNull(svaren);
        Preconditions.checkNotNull(frågorKvar);
        Preconditions.checkNotNull(undersökningId);
        Preconditions.checkNotNull(metaData);


        this.id = id;
        this.svaren = ImmutableList.copyOf(svaren);
        this.frågorKvar = ImmutableList.copyOf(frågorKvar);
        this.undersökningId = undersökningId;
        this.metaData = metaData;
    }

    public PågåendeUndersökning läggTillSvar(Svar svar) {
        // kolla att det bara finns ett svar
        svaren.forEach(
                s -> {
                    if (s.fråga.id != svar.fråga.id) throw new RuntimeException("Duplikat på fråga " + svar.fråga.id);
                });

        List<Svar> svaren2 = Lists.newArrayList(svaren);
        svaren2.add(svar);

        List<Fråga> frågorKvar2 = frågorKvar.stream().filter(s -> s.id != svar.fråga.id).collect(Collectors.toList());

        return new PågåendeUndersökning(id, svaren2, frågorKvar2, undersökningId,
                new Metadata(metaData.skapad, LocalDateTime.now()));
    }

    public boolean ärKlar() {
        return frågorKvar.isEmpty();
    }

    public Fråga nästaFråga() {
        return frågorKvar.stream().findFirst().orElse(null);
    }

}
